home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
listings
/
v_09_08
/
9n08094a
< prev
next >
Wrap
Text File
|
1991-06-26
|
2KB
|
71 lines
/* Encode a scan line and write it to a PCX file (the line is */
/* assumed to contain the color plane scan lines in sequence, */
/* with padding for an even number of bytes and trailing white */
/* data for each line as appropriate) */
void pcx_write_line
(
unsigned char *linep, /* Scan line buffer pointer */
int length, /* Scan line buffer length (in bytes) */
FILE *fp /* PCX file pointer */
)
{
int curr_data; /* Current data byte */
int prev_data; /* Previous data byte */
int data_count; /* Data repeat count */
int line_count; /* Scan line byte count */
prev_data = *linep++; /* Initialize the previous data byte */
data_count = 1;
line_count = 1;
while (line_count < length) /* Encode scan line */
{
curr_data = *linep++; /* Get the current data byte */
line_count++; /* Increment line byte count */
if (curr_data == prev_data) /* Repeating data bytes ? */
{
data_count++; /* Increment data repeat count */
if (data_count == 0x3f) /* Max allowable repeat count ? */
{
pcx_encode(prev_data, data_count, fp); /* Encode data */
data_count = 0;
}
}
else /* End of repeating data bytes */
{
if (data_count > 0)
pcx_encode(prev_data, data_count, fp); /* Encode data */
prev_data = curr_data; /* Current data byte now prev */
data_count = 1;
}
}
if (data_count > 0) /* Any remaining data ? */
{
pcx_encode(prev_data, data_count, fp); /* Encode data */
}
}
/* Write an encoded byte pair (or single byte) to a file */
void pcx_encode
(
int data, /* Data byte */
int count, /* Data byte repeat count */
@csource = FILE *fp /* PCX file pointer */
)
{
if (((data & 0xc0) == 0xc0) || count > 1)
{
putc(0xc0 | count, fp); /* Write count byte */
}
putc(data, fp); /* Write data byte */
}